package com.example.myannotation.util;

import cn.hutool.core.util.ObjectUtil;
import com.example.myannotation.annotation.MyAnnotation;
import com.example.myannotation.model.MyUser;
import org.apache.commons.lang.StringUtils;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author tianzhuang
 * @version 1.0
 * @date 2022/1/11 12:17
 */
public class ChangValue {
    /**
     * 通过注解反射更新属性的值
     *
     * @param objVal
     * @throws IllegalAccessException
     */
    public static <T> void getValByClass(T objVal) throws IllegalAccessException {
        Class<? extends T> aClass = (Class<? extends T>) objVal.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            if (declaredFields[i].isAnnotationPresent(MyAnnotation.class)) {
                MyAnnotation annotation = declaredFields[i].getAnnotation(MyAnnotation.class);
                // 获取注解中readConverterExp字符串值
                String s = annotation.readConverterExp();
                // 设置权限
                declaredFields[i].setAccessible(true);
                // 获取属性值
                Object val = declaredFields[i].get(objVal);
                if (ObjectUtil.isNotNull(val)) {
                    // 将值进行匹配，如果匹配就更新为code，不匹配还更新为原来的值进行校验
                    // 这里可以自定义不匹配的情况下制空或者其他
                    Object obj = reverseByExp(String.valueOf(val), s);
                    // 如果val不为空，更新属性值
                    declaredFields[i].set(objVal, obj);
                    Object o = declaredFields[i].get(objVal);
                }
            }
        }
    }

    /**
     * 反向解析值 0=男,1=女
     *
     * @param propertyValue 参数值
     * @param converterExp 翻译注解
     * @return 解析后值，如果存在，则返回对应的值，不存在就返回原始值
     */
    public static Object reverseByExp(String propertyValue, String converterExp)
    {
        if (StringUtils.isBlank(propertyValue)) {
            return null;
        }
        Map<String, Object> map = new HashMap<>(16);
        String[] convertSource = converterExp.split(",");
        for (String item : convertSource)
        {
            String[] itemArray = item.split("=");
            map.put(itemArray[1], itemArray[0]);
        }
        if (!map.isEmpty()) {
            if (map.containsKey(propertyValue)) {
                return map.get(propertyValue);
            }
            return propertyValue;
        }
        return propertyValue;
    }
}
